#ifndef IFDEFANIDADOS_H_
#define IFDEFANIDADOS_H_

#include "Constantes.h"
#include "Utilitarias.h"
#include "FlagsDePrograma.h"

/*  La estructura se cargara con 2 chars simbolicos: COMPILAR y NO_COMPILAR.
 *  Cada vez que se procese un ifdef o ifndef,indiceIfdefActual aumentara en 1.
 *  Cada vez que se procese un endif, indiceIfdefActual disminuira en 1.
 *  Hay un limite para la cantidad de ifdef/ifndef que se pueden almacenar
 */
class IfDefAnidados {
public:
	char tablaIfdef[ANIDAMIENTO_MAX];
	int indiceIfdefActual;

	IfDefAnidados() {
		indiceIfdefActual = 0;
		tablaIfdef[0] = COMPILAR;
	}

	bool compilar() {
		return (tablaIfdef[indiceIfdefActual] == COMPILAR);
	}

		/*  Incremento el indice del vector y almaceno el valor que se paso por parametro.
		 *  Chequeo que no se exceda la restriccion de profundidad max de anidamiento.
		 *  */
	void anidar(char codigo_A_Anidar, FlagsDePrograma& flags) {
		indiceIfdefActual++;
		setValorAnidado(indiceIfdefActual, codigo_A_Anidar);
		chequearProfundidadDeAnidamiento(flags);
	}

	void chequearProfundidadDeAnidamiento(FlagsDePrograma& flags) {
		if (indiceIfdefActual >= ANIDAMIENTO_MAX)
			flags.statusDelPrograma = ERROR_PROGRAMA;
	}

	void desanidar() {
		indiceIfdefActual--;
	}

	void invertirUltimoValorAnidado() {
		if (getUltimoValorAnidado() == COMPILAR)
			setValorAnidado(indiceIfdefActual, NO_COMPILAR);
		else
			setValorAnidado(indiceIfdefActual, COMPILAR);
	}

	char getUltimoValorAnidado() {
		return tablaIfdef[indiceIfdefActual];
	}

	void setValorAnidado(int pos, char c) {
		tablaIfdef[pos] = c;
	}
};
#endif /* IFDEFANIDADOS_H_ */
